package models

import (
	"net"
	"sync"
	"time"
)

// TunnelRequest 创建隧道的请求参数
type TunnelRequest struct {
	UserID     string `json:"userId"` // 🆕 用户ID（用于计费，可选，默认从认证信息获取）
	LocalPort  string `json:"localPort" binding:"required"`
	LocalHost  string `json:"localHost" binding:"required"`
	ServerName string `json:"serverName" binding:"required"`
	TunnelType string `json:"tunnelType" binding:"required,oneof=http tcp udp"`
}

// TunnelResponse 创建隧道的响应参数
type TunnelResponse struct {
	TunnelID   string `json:"tunnelId"`
	TunnelHost string `json:"tunnelHost"`
	TunnelPort string `json:"tunnelPort"`
	PublicPort string `json:"publicPort"`
	Domain     string `json:"domain,omitempty"`    // DNSPod创建的域名
	SubDomain  string `json:"subdomain,omitempty"` // 子域名部分
	RecordID   string `json:"recordId,omitempty"`  // DNS记录ID
}

// Tunnel 隧道结构体
type Tunnel struct {
	ID           string    `json:"id"`
	UserID       string    `json:"userId"`       // 🆕 用户ID（用于计费和权限控制）
	ProtocolType string    `json:"protocolType"` // 🆕 协议类型（HTTP/TCP/SSH等）
	LocalHost    string    `json:"localHost"`
	LocalPort    string    `json:"localPort"`
	ServerName   string    `json:"serverName"`
	TunnelHost   string    `json:"tunnelHost"`
	TunnelPort   string    `json:"tunnelPort"`
	PublicPort   string    `json:"publicPort"`
	CreatedAt    time.Time `json:"createdAt"`

	// DNSPod域名相关
	Domain    string `json:"domain,omitempty"`    // 完整域名
	SubDomain string `json:"subdomain,omitempty"` // 子域名部分
	RecordID  string `json:"recordId,omitempty"`  // DNS记录ID

	// 🚀 统一连接池（支持双向通信）
	TunnelPool interface{} `json:"-"` // *tunnel.TunnelPool，隧道连接池（3-10个连接）
	TunnelConn net.Conn    `json:"-"` // 第一个连接（向后兼容）
	PoolMutex  sync.Mutex  `json:"-"` // 🔒 连接池创建锁（防止并发创建多个连接池）

	// 请求响应映射
	RequestMap map[string]*HTTPRequest `json:"-"`
	MapMutex   sync.RWMutex            `json:"-"`

	// HTTP连接映射（用于响应转发）
	// requestID -> 浏览器连接
	HTTPConnectionMap map[string]net.Conn `json:"-"`
	ConnectionMutex   sync.RWMutex        `json:"-"` // HTTP连接映射锁

	// 隧道连接状态
	IsConnected bool `json:"isConnected"`

	// 公共端口监听器
	PublicListener net.Listener `json:"-"`
}

// HTTPRequest HTTP请求信息
type HTTPRequest struct {
	ID         string              `json:"id"`
	Method     string              `json:"method"`
	Path       string              `json:"path"`
	Headers    map[string][]string `json:"headers"`
	Body       []byte              `json:"body"`
	CreatedAt  time.Time           `json:"createdAt"`
	ClientAddr string              `json:"clientAddr"` // 🆕 浏览器源地址（用于客户端日志）

	// 🔥 多路复用模式：连接管理字段（用于响应完成后释放请求计数）
	TunnelConnection interface{} `json:"-"` // *tunnel.TunnelConnection
	RequestStartTime time.Time   `json:"-"` // 请求开始时间
	RequestSize      int64       `json:"-"` // 请求大小
}

// HTTPResponse HTTP响应信息
type HTTPResponse struct {
	StatusCode int                 `json:"statusCode"`
	Headers    map[string][]string `json:"headers"`
	Body       []byte              `json:"body"`
}

// TunnelPacket TCP隧道数据包
type TunnelPacket struct {
	Type      string              `json:"type"` // request, response
	RequestID string              `json:"requestId"`
	Method    string              `json:"method,omitempty"`
	Path      string              `json:"path,omitempty"`
	Headers   map[string][]string `json:"headers,omitempty"`
	Body      []byte              `json:"body,omitempty"`
	Status    int                 `json:"status,omitempty"`
}
